/**
    @brief Module Group, fichier source
    @file group.cpp
    @version 1.0
    @date 2008/11/01

*/
#include <string>
#include "./group.h"
#include "../user/user.h"
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>


/**
    @brief Constructeur de groupe
    @return none
*/
Group::Group(void)
{
    groupname="";

}
/**
    @brief Constructeur de groupe
    @param [in] name Nom du groupe
    @return none
*/
Group::Group(string name)
{
    groupname=name;
}
/**
    @brief Destructeur du groupe
    @return none
*/
Group::~Group(void)
{
}
/**
    @brief Retourne le nom du groupe
    @return string
*/


string Group::_name(void) const
{
    return groupname;
}

unsigned int Group::_size(void) const
{
    return members.size();
}

set<User>::iterator Group::_firstUser(void) const
{
    return members.begin();
}

set<User>::iterator Group::_lastUser(void) const
{
    return --(members.end());
}

set<User>::iterator Group::_end(void) const
{
    return members.end();
}

/**
    @brief Retourne le vecteur membres
    @return vector<User>
*/
set<User> Group::_members(void) const
{
    return members;
}
/**
    @brief Défini le champ name
    @return none
*/
void Group::setName(string name)
{
    groupname=name;
}
/**
    @brief Test si le groupe est vide
    @return bool
*/
bool Group::isEmpty(void)
{
    return(members.empty());
}

/**
    @brief test si un utilisateur est membre du groupe
    @param [in] john Membre à controler
    @return bool

    Exemple :
    @code
    myGroup.isMember( myUser );
    @endcode

*/

bool Group::isMember(const string& name)
{
    set<User>::iterator it;

    for(it=members.begin(); it != members.end(); it++)
    {
        if(it->_nickname() == name)
        {
            return true;
        }
    }
    return false;
}

/**
    @brief Ajoute un membre au groupe
    @param [in] u Membre à controler
    @return none

    Exemple :
    @code
    myGroup.addMember( myUser);
    @endcode
*/
void Group::addMember(User u)
{
    members.insert(u);
}

/**
    @brief Recherche un utilisateur selon un champ donné
    @param [in] type Champ de recherche ("ip" ou "nickname")
    @param [in] value Valeur de la recherche
    @return id du membre

    Exemple :
    @code
    myGroup.findBy("nickname","bob");
    myGroup.findBy("ip","82.123.124.125");
    @endcode
    @warning Le champ doit exister ainsi que l'utilisateur recherché
*/
/*
int Group::findBy(string type, string value)
{
    int idVect=0;
    std::vector<User>::iterator i = members.begin();
    if(type=="nickname")
    {
        while(i!=members.end()&&i->_nickname()!=value)
        {

            idVect++;
            ++i;
        }
        if(i==members.end())
        {
            printf("Wrong Nickname \n");
            exit(-1);
        }
    }
    else if( type=="ip")
    {
        while(i!=members.end() && i->_address()!=value )
        {

            idVect++;
            ++i;
        }
        if(i==members.end())
        {
            printf("Wrong Ip\n");
            exit(-1);
        }

    }
    else
    {
        printf("Wrong Type\n");
        exit(-1);

    }
    return idVect;
}
*/
/**
    @brief Recherche un utilisateur selon un champ donné
    @param [in] type Champ de recherche ("ip" ou "nickname")
    @param [in] value Valeur de la recherche
    @return User

    Exemple :
    @code
    myGroup.getUserBy("nickname","bob");
    myGroup.getUserBy("ip","82.123.124.125");
    @endcode
    @warning Le champ doit exister ainsi que l'utilisateur recherché
*/
/*
User Group::getUserBy(string type, string value)
{
    std::vector<User>::iterator i = members.begin();
    if(type=="nickname")
    {
        while(i!=members.end() && i->_nickname()!=value)
        {
            ++i;
        }
        if(i==members.end())
        {
            printf("Wrong Nickname \n");
            exit(-1);
        }
    }
    else if( type=="ip")
    {
        while(i==members.end() && i->_address()!=value)
        {
            ++i;
        }
        if(i==members.end())
        {
            printf("Wrong Ip \n");
            exit(-1);
        }

    }
    else
    {
        printf("Wrong Type \n");
        exit(-1);

    }
    return *i;
}
*/
